﻿using Microsoft.SqlServer.Server;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Threading;
using System.Windows;
using System;
using System.Security.Cryptography;

namespace AutomationCommand
{
    public class wb_open_pg : BasiCommand
    {
        [JsonProperty("sizex")]
        public int SizeX { get; set; }

        [JsonProperty("sizey")]
        public int SizeY { get; set; }

        [JsonProperty("display")]
        public bool Display { get; set; }

        [JsonProperty("url")]
        public string Url { get; set; }


        /// <summary>
        /// web代理
        /// </summary>
        [JsonProperty("proxy")]
        public bool Proxy { get; set; }
        /// <summary>
        /// 远程浏览器
        /// </summary>
        [JsonProperty("remote")]
        public bool Remote { get; set; }
        /// <summary>
        /// 浏览器参数
        /// </summary>
        [JsonProperty("options")]
        public Options Options { get; set; }
        /// <summary>
        /// 浏览器驱动
        /// </summary>
        public ChromeDriver driver = null;
        /// <summary>
        /// 是否隐藏命令行窗口
        /// </summary>
        public bool HideCommandWindow = true;

        public JObject Config { get; set; }
        public wb_open_pg()
        {
            FunctionType = "wb_open_pg";
            OtherName = "打开浏览器";
            SuccessJump = -1;
            FailureJump = -1;
            SizeX = 300;
            SizeY = 300;
            Display = true;
            Url = "";
            Proxy = false;
            Remote = false;
            Options = new Options();
        }

        public  bool Execute(JObject command)
        {
            Console.WriteLine(command["fun_type"]);
            // 在这里编写执行命令的逻辑
            try
            {
                //当前目录
                string currentPath = System.Environment.CurrentDirectory+ "\\chromedriver.exe";
                Console.WriteLine(currentPath);
                ChromeDriverService service = ChromeDriverService.CreateDefaultService(currentPath);//定义申明一个某进程
                ChromeOptions options = new ChromeOptions();

                //是否显示浏览器
                if (!Display)
                {
                    options.AddArgument("--headless"); // 启用无头模式，使浏览器以隐藏方式运行
                }
                //是否显示命令行窗口
                if (HideCommandWindow)
                {
                    service.HideCommandPromptWindow = true;
                }



                //处理打开浏览器的逻辑:1.未正常关闭浏览器 2.正常关闭浏览器 3.第一次打开浏览器  4.已经打开浏览器
                //.....未完善
                if (driver == null)
                {
                    driver = new ChromeDriver(service,options);
                }

                //web代理开启
                //....未完善
                if (Proxy)
                {
                    //需要从匹配文件读取代理数据


                    //string IPweb = new FFunction.WebFunction().GetIP();//本机公网IP
                    //DataRow msdt = Form1.Missions[Form1.Missionmange.MissionIndex(aid)].DatarowControls.datarow;//任务数据
                    //JObject msdtConfig = (JObject)JsonConvert.DeserializeObject(msdt["mconfig"].ToString());//任务配置数据
                    //if (!msdtConfig.ContainsKey("proxy"))
                    //{
                    //    MessageBox.Show("无有效代理。。");
                    //    Form1.MissionToken = -1;//无条件归还TOKEN
                    //    return false;
                    //}//如果没有代理数据
                    //JObject proxyJ = (JObject)msdtConfig["proxy"];//获取代理数据
                    //if (!proxyJ.ContainsKey("c") || !proxyJ.ContainsKey("l"))
                    //{
                    //    MessageBox.Show("代理数据不完整。。");
                    //    Form1.MissionToken = -1;
                    //    return false;

                    //}//代理数据是否完整
                    //int proxyC = 0;//代理ID
                    //JArray proxyL = new JArray();//代理列表
                    //try
                    //{
                    //    proxyC = Convert.ToInt32(proxyJ["c"].ToString());
                    //    proxyL = (JArray)proxyJ["l"];
                    //}
                    //catch (Exception)
                    //{

                    //    MessageBox.Show("请设置有效的代理");
                    //    Form1.MissionToken = -1;
                    //    return false;
                    //}
                    //JObject proxyOne = new JObject();
                    //try
                    //{
                    //    proxyOne = (JObject)proxyL[proxyC - 1];
                    //}
                    //catch (Exception)
                    //{

                    //    MessageBox.Show("请设置有效的代理");
                    //    Form1.MissionToken = -1;
                    //    return false;
                    //}
                    //string dw = "", aw = "", gt = "", wt = "";
                    //if (proxyOne.ContainsKey("dw") && proxyOne.ContainsKey("aw") && proxyOne.ContainsKey("gt") && proxyOne.ContainsKey("wt"))
                    //{
                    //    dw = proxyOne["dw"].ToString();//删除白名单接口
                    //    aw = proxyOne["aw"].ToString();//添加白名单接口
                    //    gt = proxyOne["gt"].ToString();//获取IP地址接口
                    //    wt = proxyOne["wt"].ToString();//获取历史白名单

                    //}
                    //else
                    //{
                    //    MessageBox.Show("请设置有效的代理");
                    //    Form1.MissionToken = -1;
                    //    return false;

                    //}


                    //if (proxyC <= proxyL.Count && proxyC > 0 && aw != "" && gt != "")
                    //{
                    //    //////////////////删除历史白名单///////////////////////
                    //    if (wt != "" && wt.Split('.').Length == 4)
                    //    {
                    //        if (wt != IPweb)
                    //        {
                    //            if (dw != "")
                    //            {
                    //                new _Api.DateApi().PostData(dw + wt, "");
                    //            }//如果有删除白名单地址，就删除老的白名单。
                    //            proxyOne["wt"] = IPweb;//保存当前的IP 就可以了
                    //            _Sql.lc_dt_update sv = new _Sql.lc_dt_update();
                    //            //判断保存路径
                    //            Tuple<int, int> missionFlag = Form1.Missionmange.missionType.Find(delegate (Tuple<int, int> x)
                    //            {

                    //                return x.Item1 == aid;
                    //            });
                    //            if (missionFlag == null)
                    //            {
                    //                MessageBox.Show("当前任务异常401");
                    //                Form1.MissionToken = -1;
                    //                return false;
                    //            }
                    //            else
                    //            {
                    //                if (missionFlag.Item2 == 0)
                    //                {
                    //                    string midS = Form1.Missions[Form1.Missionmange.MissionIndex(aid)].DatarowControls.datarow["mid"].ToString();
                    //                    midS = midS.Substring(3, midS.Length - 3);
                    //                    sv.tablename = "mission_local";
                    //                    sv.dataDir = Form1.dataDir;
                    //                    sv.lmti = 0;
                    //                    sv.lmte = 1;
                    //                    sv.addcondition("mid", "=", midS.ToString());//
                    //                    sv.addkeyvalue("mconfig", msdtConfig.ToString());//应用:应用配置文档

                    //                }//测试:tablename="mission_local"
                    //                else if (missionFlag.Item2 == 1)
                    //                {
                    //                    sv.tablename = "mission_action_local";
                    //                    sv.dataDir = Form1.dataDir;
                    //                    sv.lmti = 0;
                    //                    sv.lmte = 1;
                    //                    sv.addcondition("aid", "=", aid.ToString());//应用:在数据库中的主键作为索引
                    //                    sv.addkeyvalue("mconfig", msdtConfig.ToString());//应用:应用配置文档
                    //                }//正式:tablename="mission_action_local"
                    //            }
                    //            //判断保存路径
                    //            sv.act();
                    //            msdt["mconfig"] = msdtConfig.ToString();
                    //        }//先删除之前的老IP白名单,再保存当前IP
                    //    }//保存过IP
                    //    else
                    //    {
                    //        proxyOne["wt"] = IPweb;//保存当前的IP 就可以了
                    //        _Sql.lc_dt_update sv = new _Sql.lc_dt_update();
                    //        //判断保存路径
                    //        Tuple<int, int> missionFlag = Form1.Missionmange.missionType.Find(delegate (Tuple<int, int> x)
                    //        {

                    //            return x.Item1 == aid;
                    //        });
                    //        if (missionFlag == null)
                    //        {
                    //            Form1.MissionToken = -1;
                    //            return false;
                    //        }
                    //        else
                    //        {
                    //            if (missionFlag.Item2 == 0)
                    //            {
                    //                string midS = Form1.Missions[Form1.Missionmange.MissionIndex(aid)].DatarowControls.datarow["mid"].ToString();
                    //                midS = midS.Substring(3, midS.Length - 3);
                    //                sv.tablename = "mission_local";
                    //                sv.dataDir = Form1.dataDir;
                    //                sv.lmti = 0;
                    //                sv.lmte = 1;
                    //                sv.addcondition("mid", "=", midS.ToString());//
                    //                sv.addkeyvalue("mconfig", msdtConfig.ToString());//应用:应用配置文档

                    //            }//测试:tablename="mission_local"
                    //            else if (missionFlag.Item2 == 1)
                    //            {
                    //                sv.tablename = "mission_action_local";
                    //                sv.dataDir = Form1.dataDir;
                    //                sv.lmti = 0;
                    //                sv.lmte = 1;
                    //                sv.addcondition("aid", "=", aid.ToString());//应用:在数据库中的主键作为索引
                    //                sv.addkeyvalue("mconfig", msdtConfig.ToString());//应用:应用配置文档
                    //            }//正式:tablename="mission_action_local"
                    //        }
                    //        //判断保存路径
                    //        sv.act();
                    //    }//没有保存过:那就新保存一个.
                    //     //////////////////删除历史白名单///////////////////////
                    //    if (wt != IPweb)
                    //    {
                    //        string IPwhite = new _Api.DateApi().PostData(aw + IPweb, "");
                    //    }//如果新老IP不一样。。。才添加白名单。。
                    //    string IPproxy = new _Api.DateApi().PostData(gt, "");
                    //    //分割端口和IP
                    //    string[] ipNports = IPproxy.Split(':');
                    //    if (ipNports.Length == 2)
                    //    {
                    //        FirefoxProfile fp = new FirefoxProfile();
                    //        fp.SetPreference("network.proxy.type", 1);
                    //        fp.SetPreference("network.proxy.http", ipNports[0]);
                    //        fp.SetPreference("network.proxy.http_port", Convert.ToInt32(ipNports[1]));
                    //        fp.SetPreference("network.proxy.ssl", ipNports[0]);
                    //        fp.SetPreference("network.proxy.ssl_port", Convert.ToInt32(ipNports[1]));
                    //    }
                    //    else
                    //    {
                    //        Form1.MissionToken = -1;
                    //        return false;
                    //    }
                    //}//当选择的代理ID在范围内， 开启代理

                }//是否需要开代理。。

                if (Remote)
                {
                    WebDriverException ex = new WebDriverException();
                }

                driver.Manage().Window.Size = new System.Drawing.Size(SizeX, SizeY);
                // 打开指定的 URL
                driver.Navigate().GoToUrl(Url);

                // 执行其他浏览器操作

                return true; // 假设此处始终成功
            }
            catch (Exception ex)
            {
                // 处理异常情况
                Console.WriteLine("发生异常：" + ex.Message);
                return false;
            }


        }

        public bool KillChromeDriver()
        {
            driver.Close();
            return false;
        }
        /// <summary>
        /// 处理代理问题
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        private void SetProxy(string ip, int port)
        {
        }

        /// <summary>
        /// 远程浏览器获取处理
        /// </summary>
        private void SetRemote()
        {
        }

    }

    public class Options
    {
        [JsonProperty("checked")]
        public int Checked { get; set; }

        [JsonProperty("w")]
        public int Width { get; set; }

        [JsonProperty("h")]
        public int Height { get; set; }

        [JsonProperty("PixelRatio")]
        public double PixelRatio { get; set; }

        [JsonProperty("UserAgent")]
        public string UserAgent { get; set; }

        [JsonProperty("Argument")]
        public string[] Argument { get; set; }
    }
}
